package com.qdxwx.sms;

import com.qdxwx.common.utils.PropertyUtils;
import com.qdxwx.sms.tencent.common.Credential;
import com.qdxwx.sms.tencent.common.exception.TencentCloudSDKException;
import com.qdxwx.sms.tencent.common.profile.ClientProfile;
import com.qdxwx.sms.tencent.common.profile.HttpProfile;
import com.qdxwx.sms.tencent.common.profile.Region;
import com.qdxwx.sms.tencent.v20210111.SmsClient;
import com.qdxwx.sms.tencent.v20210111.models.SendSmsRequest;
import com.qdxwx.sms.tencent.v20210111.models.SendSmsResponse;
import com.qdxwx.sms.tencent.v20210111.models.SendStatus;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Qdx NetSchool Platform
 * @author qdxwx
 * @updateTime 2022/5/25
 * @description
 */
public class QdxSmsClient {

    private SmsClient smsClient;
    private String SdkAppId;//短信应用Id
    private String SdkSign;//短信签名

    public QdxSmsClient() {
        Properties properties = PropertyUtils.getInstance("sms-config");
        Map<String, Object> config = new HashMap<>();
        config.put("secretId", properties.get("tencent.secretId"));
        config.put("secretKey", properties.get("tencent.secretKey"));
        this.InitSmsClient(config);
    }

    public QdxSmsClient(Map<String, Object> config) {
        InitSmsClient(config);
    }

    public void setSdkAppId(String sdkAppId) {
        SdkAppId = sdkAppId;
    }

    public void setSdkSign(String sdkSign) {
        SdkSign = sdkSign;
    }

    public boolean SendRegisterCode(String phoneNumber, String code) {
        return SendMsg(phoneNumber, QdxSmsTemplateIds.register.id, code);
    }

    public boolean SendLoginCode(String phoneNumber, String code) {
        return SendMsg(phoneNumber, QdxSmsTemplateIds.login.id, code);
    }

    public boolean SendRePasswordCode(String phoneNumber, String code) {
        return SendMsg(phoneNumber, QdxSmsTemplateIds.rePassword.id, code);
    }

    public boolean SendOtherCode(String phoneNumber, String code) {
        return SendMsg(phoneNumber, QdxSmsTemplateIds.other.id, code);
    }

    public SendStatus[] SendBatch(String[] phoneNumber, String templateId, String[] templateParams) {

        if (phoneNumber == null || templateParams == null) return null;

        QdxSmsRequest req = new QdxSmsRequest();
        if (this.SdkAppId != null) {
            req.setSmsSdkAppId(this.SdkAppId);
        }
        if (this.SdkSign != null) {
            req.setSignName(this.SdkSign);
        }
        req.setPhoneNumberSet(phoneNumber);
        req.setTemplateParamSet(templateParams);
        req.setTemplateId(templateId);
        SendSmsResponse res = SendSms(req);
        //SendStatus[] sendStatuses = res.getSendStatusSet();
        // 输出json格式的字符串回包
        if (res == null) return null;
        // 也可以取出单个值，你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
        return res.getSendStatusSet();
    }

    public boolean SendMsg(String phoneNumber, String templateId, String... params) {

        if (phoneNumber == null || params == null) return false;

        QdxSmsRequest req = new QdxSmsRequest();
        if (this.SdkAppId != null) {
            req.setSmsSdkAppId(this.SdkAppId);
        }
        if (this.SdkSign != null) {
            req.setSignName(this.SdkSign);
        }
        req.setPhoneNumber(phoneNumber);
        req.setTemplateParamSet(params);
        req.setTemplateId(templateId);
        /* 国际/港澳台短信 senderid: 国内短信填空，默认未开通，如需开通请联系 [sms helper] */
        //String senderid = "xxx";
        //req.setSenderId(senderid);
        //用户的 session 内容: 可以携带用户侧 Id 等上下文信息，server 会原样返回
        //if (this.sessionContext != null) {
        //    req.setSessionContext(this.sessionContext);
        //}
        SendSmsResponse res = SendSms(req);
        //SendStatus[] sendStatuses = res.getSendStatusSet();
        // 输出json格式的字符串回包
        if (res == null) return false;
        // 也可以取出单个值，你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
        SendStatus status = res.getSendStatusSet()[0];

        return status.getCode().equalsIgnoreCase("OK");
    }

    /**
     * @param req 短信参数
     * @return bool
     */
    private SendSmsResponse SendSms(SendSmsRequest req) {
        try {
            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
            return smsClient.SendSms(req);
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            return null;
        }
    }

    private void InitSmsClient(Map<String, Object> config) {
        Object secretId = config.get("secretId");
        Object secretKey = config.get("secretKey");
        if (secretId == null || secretKey == null) {
            System.out.println("InitSmsClient:secretId is null");
            return;
        }
        /* 必要步骤：
         * 实例化一个认证对象，入参需要传入腾讯云账户密钥对secretId，secretKey。
         * 这里采用的是从环境变量读取的方式，需要在环境变量中先设置这两个值。
         * 你也可以直接在代码中写死密钥对，但是小心不要将代码复制、上传或者分享给他人，
         * 以免泄露密钥对危及你的财产安全。
         * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/
        Credential cred = new Credential(secretId.toString(), secretKey.toString());

        // 实例化一个http选项，可选，没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        /* SDK默认使用POST方法。
         * 如果你一定要使用GET方法，可以在这里设置。GET方法无法处理一些较大的请求 */
        httpProfile.setReqMethod("POST");
        /* SDK有默认的超时时间，非必要请不要进行调整
         * 如有需要请在代码中查阅以获取最新的默认值 */
        httpProfile.setConnTimeout(60);
        /* SDK会自动指定域名。通常是不需要特地指定域名的，但是如果你访问的是金融区的服务
         * 则必须手动指定域名，例如sms的上海金融区域名： sms.ap-shanghai-fsi.tencentcloudapi.com */
        httpProfile.setEndpoint("sms.tencentcloudapi.com");

        /* 非必要步骤:
         * 实例化一个客户端配置对象，可以指定超时时间等配置 */
        ClientProfile clientProfile = new ClientProfile();
        /* SDK默认用TC3-HMAC-SHA256进行签名
         * 非必要请不要修改这个字段 */
        clientProfile.setSignMethod("HmacSHA256");
        clientProfile.setHttpProfile(httpProfile);
        /* 实例化要请求产品(以sms为例)的client对象
         * 第二个参数是地域信息，可以直接填写字符串ap-guangzhou，或者引用预设的常量 */

        smsClient = new SmsClient(cred, Region.Guangzhou.toString(), clientProfile);
    }

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("123", "156");
        System.out.println((String) map.get("test"));
    }

}